﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SistemaAcademicoBLL.Util
{
    public class Validator
    {
        public static Boolean ValidateEmail(String email)
        {
            string validaEmail = "false";

            if (email.Contains('@'))
            {
                string[] validacao = email.Split('@');

                string p1Email = validacao[0];

                string p2Email = validacao[1];

                if (p1Email.Length >= 2)
                {
                    if (p2Email.Length >= 3)
                    {
                        if (p2Email.Contains('.'))
                        {
                            string[] validacao2 = p2Email.Split('.');

                            string p3Email = validacao2[0];

                            string p4Email = validacao2[1];

                            if (p3Email.Length >= 2 && p4Email.Length >= 2)
                                validaEmail = "true";
                        }
                    }
                }
            }
            if (validaEmail == "true")
                return true;
            else
                return false;
        }

        public static Boolean ValidateCPF(string sourceCPF)
        {
            // Pré-Verificação do Tamanho da String (Apenas para Performance)
            if (sourceCPF.Length != 14)
            {
                return false;
            }

            // Cria Objetos
            String clearCPF;
            Int32[] cpfArray;
            Int32 totalDigitoI = 0;
            Int32 totalDigitoII = 0;
            Int32 modI;
            Int32 modII;

            // Limpa o CPF
            clearCPF = sourceCPF.Trim(); // Elimina Espaços em Branco
            clearCPF = clearCPF.Replace("-", ""); // Remove Separador de Dígito Verificador
            clearCPF = clearCPF.Replace(".", ""); // Remove os Separadores das Casas

            // Verifica o Tamanho do Texto de Input
            if (clearCPF.Length != 11)
            {
                return false;
            }

            // Verifica os Patterns mais Comuns para CPF's Inválidos
            if (clearCPF.Equals("00000000000") || clearCPF.Equals("11111111111") ||
                clearCPF.Equals("22222222222") || clearCPF.Equals("33333333333") ||
                clearCPF.Equals("44444444444") || clearCPF.Equals("55555555555") ||
                clearCPF.Equals("66666666666") || clearCPF.Equals("77777777777") ||
                clearCPF.Equals("88888888888") || clearCPF.Equals("99999999999"))
            {
                return false;
            }

            // Verifica se no Array Existe Apenas Números
            foreach (Char c in clearCPF)
            {
                if (!Char.IsNumber(c))
                {
                    return false;
                }
            }

            // Converte o CPF em Array Numérico para Validar
            cpfArray = new Int32[11];

            for (Int32 i = 0; i < clearCPF.Length; i++)
            {
                cpfArray[i] = Int32.Parse(clearCPF[i].ToString());
            }

            // Computa os Totais para os 2 Dígitos Verificadores
            for (Int32 position = 0; position < cpfArray.Length - 2; position++)
            {
                totalDigitoI += cpfArray[position] * (10 - position);
                totalDigitoII += cpfArray[position] * (11 - position);
            }

            // Aplica Regras do Dígito 1
            modI = totalDigitoI % 11;

            if (modI < 2)
            {
                modI = 0;
            }
            else
            {
                modI = 11 - modI;
            }

            // Verifica o Digito 1
            if (cpfArray[9] != modI)
            {
                return false;
            }

            // Aplica o Peso para o Digito Verificador 2
            totalDigitoII += modI * 2;

            // Aplica Regras do Dígito Verificador 2
            modII = totalDigitoII % 11;

            if (modII < 2)
            {
                modII = 0;
            }
            else
            {
                modII = 11 - modII;
            }

            // Verifica o Digito 2
            if (cpfArray[10] != modII)
            {
                return false;
            }

            // CPF Válido!
            return true;
        }

        public static String RetirarPontoCPF(String cpf)
        {
            String newCpf = cpf;
            if (newCpf.Contains("."))
            {
                String[] ArrCpF = new String[4];
                char[] separador = { '.', '-' };
                ArrCpF = newCpf.Split(separador);
                newCpf = ArrCpF[0] + ArrCpF[1] + ArrCpF[2] + ArrCpF[3];
            }
            return newCpf;
        }

        public static String ColocaPontoCPF(String cpf)
        {
            cpf = cpf.Insert(3, ".");
            cpf = cpf.Insert(7, ".");
            cpf = cpf.Insert(11, "-");
            return cpf;
        }

        public static String RetiraPontoUniversal(String doc)
        {
            doc = doc.Trim(); // Elimina Espaços em Branco
            doc = doc.Replace("-", ""); // Remove Separador de Dígito Verificador
            doc = doc.Replace(".", ""); // Remove os Separadores das Casas

            return doc;
        }
    }
}
